package com.tcm.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.tcm.config.AppProperties;
import com.tcm.entity.ClozeItem;
import com.tcm.entity.bo.ClozeItemExcel;
import com.tcm.entity.dto.ClozeItemUpdateDto;
import com.tcm.entity.dto.param.ClozeItemPageParam;
import com.tcm.entity.vo.BatchImportResult;
import com.tcm.entity.vo.ClozeItemListResult;
import com.tcm.entity.resp.PageR;
import com.tcm.exception.DatabaseOperationException;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

/**
 * 填空题业务接口
 * @author Guqier
 * @version 1.0
 * @date 2023/7/14 16:51
 */
public interface ClozeItemService extends IService<ClozeItem> {
    @Transactional
    boolean addClozeItem(ClozeItemUpdateDto clozeItemUpdateDto, Long currUserId);

    boolean removeClozeItem(List<Long> ids, Long currUserId) throws Exception;

    PageR<ClozeItemListResult> getClozeItemListByPage(ClozeItemPageParam param);

    @Transactional
    boolean modifyClozeItem(ClozeItemUpdateDto clozeItemUpdateDto, Long currUserId) throws DatabaseOperationException;

    BatchImportResult<ClozeItemExcel> importClozeItem(MultipartFile file, Long currUserId) throws IOException;

    @Transactional
    boolean confirmBatchClozeItem(String uuid, Long currUserId) throws DatabaseOperationException;

    void exportImportFailedClozeItem(String uuid, HttpServletResponse response) throws Exception;

    void exportClozeItem(ClozeItemPageParam param, HttpServletResponse response) throws IOException;

    List<ClozeItemListResult> getClozeItemByIds(List<Long> ids);

    List<ClozeItemListResult> transferClozeItemToListResult(List<ClozeItem> clozeItems);

    ClozeItem getClozeItemById(Long id);

    @CacheEvict(value = AppProperties.ENTITY_CACHE_ITEM_CLOZE, key = "#id", condition = "#id != null")
    boolean removeClozeItemById(Long id);
}
